package com.jacobson.huobi.utils;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import com.jacobson.huobi.Constants;
import com.jacobson.huobi.entities.vo.LoginRespVo;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;


/**
 * @author Stay
 *      在Application中统一捕获异常，保存到文件中下次再打开时上传
 */
public class CrashHandler implements Thread.UncaughtExceptionHandler {
    /** 是否开启日志输出,在Debug状态下开启,
     * 在Release状态下关闭以提示程序性能
     * */
    public static final boolean DEBUG = true;
    /** 系统默认的UncaughtException处理类 */
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    /** CrashHandler实例 */
    private static CrashHandler INSTANCE;
    /** 程序的Context对象 */
//    private Context mContext;
    /** 保证只有一个CrashHandler实例 */
    private CrashHandler() {}
    /** 获取CrashHandler实例 ,单例模式*/
    public static CrashHandler getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new CrashHandler();
        }
        return INSTANCE;
    }

    /**
     * 初始化,注册Context对象,
     * 获取系统默认的UncaughtException处理器,
     * 设置该CrashHandler为程序的默认处理器
     *
     * @param ctx
     */
    public void init(Context ctx) {
//        mContext = ctx;
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 当UncaughtException发生时会转入该函数来处理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if ( mDefaultHandler != null) {
            postReport(ex);
            //如果用户没有处理则让系统默认的异常处理器来处理
//            android.os.Process.killProcess(android.os.Process.myPid());
            mDefaultHandler.uncaughtException(thread, ex);
        } else {  //如果自己处理了异常，则不会弹出错误对话框，则需要手动退出app
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }

        }
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(10);
    }

    // TODO 使用HTTP Post 发送错误报告到服务器  这里不再赘述
    private void postReport(Throwable ex) {
//      在上传的时候还可以将该app的version，该手机的机型等信息一并发送的服务器，
//      Android的兼容性众所周知，所以可能错误不是每个手机都会报错，还是有针对性的去debug比较好
        try {

                        //读取登陆用户信息
                        LoginRespVo loginRespVo =  TokenStorageUtil.INSTANCE.read();
                        if (loginRespVo == null) {
                            return;
                        }
                        File file = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + loginRespVo.getUserId() + "_log.txt");

                        FileWriter fileWriter = new FileWriter(file, true);
                        StringWriter sw = new StringWriter();
                        PrintWriter pw = new PrintWriter(sw);
                        ex.printStackTrace(pw);

                        fileWriter.write("\r\n" + sw.toString() + "\r\n");
                        fileWriter.close();


        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}